home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / MISC.SWG / 0129_Example of how to read Verison 3.x SWAG.pas < prev    next >
Pascal/Delphi Source File  |  1995-02-28  |  3KB  |  98 lines

  1. program ReadSwag;
  2. {+$X}
  3. uses Dos,Crt;
  4.  
  5. type
  6.   SwagHeader =
  7.     RECORD
  8.       HeadSize : BYTE;                  {size of header}
  9.       HeadChk  : BYTE;                  {checksum for header}
  10.       HeadID   : ARRAY [1..5] OF CHAR;  {compression type tag}
  11.       NewSize  : LONGINT;               {compressed size}
  12.       OrigSize : LONGINT;               {original size}
  13.       Time     : WORD;                  {packed time}
  14.       Date     : WORD;                  {packed date}
  15.       Attr     : WORD;                  {file attributes and flags}
  16.       BufCRC   : LONGINT;               {32-CRC of the Buffer }
  17.       Swag     : STRING[12];            {stored SWAG filename}
  18.       Subject  : STRING[40];            {snipet subject}
  19.       Contrib  : STRING[35];            {contributor}
  20.       Keys     : STRING[70];            {search keys, comma deliminated}
  21.       FName    : PathStr;               {filename (variable length)}
  22.       CRC      : WORD;                  {16-bit CRC (immediately follows FName)}
  23.     END;
  24.  
  25. PROCEDURE SWAGView (LzhFile : PathStr);
  26.  
  27. VAR
  28.  
  29.   Swaghead   : Swagheader;
  30.   HeadA      : ARRAY [1..SIZEOF (Swagheader) ] OF BYTE ABSOLUTE Swaghead;
  31.   inFile     : FILE; { File to be processed }
  32.   J, LZHpos  : LONGINT;
  33.   numread, i  : WORD;
  34.  
  35. FUNCTION Mksum : BYTE;  {calculate check sum For File header }
  36. VAR
  37.   i : INTEGER;
  38.   b : BYTE;
  39. BEGIN
  40.   b := 0;
  41.   FOR i := 3 TO Swaghead.headsize + 2 DO b := b + HeadA [i];
  42.   mksum := b;
  43. END;
  44.  
  45. PROCEDURE ShowView;
  46. BEGIN
  47.     with Swaghead do
  48.       begin
  49.         writeln('==================================================');
  50.         writeln('Header size = ', HeadSize);
  51.         writeln('compressed size = ', NewSize);
  52.         writeln('stored SWAG filename = ', Swag);
  53.         writeln('snipet subject = ', Subject);
  54.         writeln('Contributor = ', Contrib);
  55.         writeln('Search keys = ', Keys);
  56.         writeln('File name = ', Fname);
  57.       end;
  58. END;
  59.  
  60. BEGIN
  61.  
  62.   Assign(infile,LzhFile);
  63.   Reset(infile, 1);
  64.  
  65.   {Goto start of File}
  66.   LZHPos := 0;
  67.  
  68.   REPEAT
  69.  
  70.     { Move to the correct position }
  71.     SEEK (inFile, LZHpos);
  72.     {Read Fileheader}
  73.     BLOCKREAD (inFile, HeadA, SIZEOF (Swagheader), numread);
  74.     { get the position of the next header }
  75.     LZHpos := LZHpos + Swaghead.headsize + 2 + Swaghead.Newsize;
  76.     { check the checksum }
  77.     i := Mksum;
  78.  
  79.     IF Swaghead.headsize <> 0 THEN
  80.     BEGIN
  81.       IF i <> Swaghead.headchk THEN
  82.       BEGIN
  83.         { ERROR : FORMAT ERROR !! }
  84.         CLOSE (infile);
  85.         EXIT;
  86.       END;
  87.     ShowView;
  88.     END;
  89.  
  90.   UNTIL   (Swaghead.headsize = 0);
  91.  
  92.   CLOSE (infile);
  93.  
  94. END;
  95.  
  96. BEGIN
  97.     SwagView('d:\swag\files\oop.swg');
  98. END.